#include <iostream>
#include <unistd.h>
#include <signal.h>

void PrintPending(const sigset_t &pending)
{
    std::cout << "pending list [" << getpid() << "]: ";
    for (int signo = 31; signo > 0; signo--)
    {
        if (sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}

void non_handler(int signo)
{
    std::cout << "处理" << signo << "号信号" << std::endl;
}

int main()
{
    ::signal(2, SIG_DFL);     //默认信号
    ::signal(2, SIG_IGN);     //忽略信号
    ::signal(2, non_handler); //自定义信号

    // 1. 对2号信号进行屏蔽
    // 需要清空栈上开辟的空间
    sigset_t block, oldblock;
    sigemptyset(&block);
    sigemptyset(&oldblock);
    // 1.1 添加2号信号
    // 这里我们有没有把2号信号屏蔽，设置进入内核中？
    // 并没有！只是在用户栈上设置了位图结构
    sigaddset(&block, 2);
    // 1.2 设置进入内核中
    sigprocmask(SIG_SETMASK, &block, &oldblock);

    int cnt = 0;
    while (true)
    {
        // 2.获取pending表
        sigset_t pending;
        sigpending(&pending);

        // 3.打印pending表
        PrintPending(pending);

        sleep(1);

        cnt++;
        if(cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK, &oldblock, nullptr);
        }
    }

    return 0;
}

// void Hander(int signo)
// {
//     std::cout << "获取了一个信号: " << signo << std::endl;
// }

// int main()
// {
//     // 先对6号信号进行捕捉
//     // signal(6, Hander);

//     while (true)
//     {
//         // 每隔1秒给自己发送6号信号: 执行Hander函数
//         sleep(1);
//         abort();
//     }

//     return 0;
// }